/*
****************************************************************************************
** braif: LCD板载初始化
**
** Author: xiongjinqi
** Date:  2022/11/30
** History: 
        2022/11/30: 初始版本
****************************************************************************************
*/
#ifndef __BSP_LCD_H_
#define __BSP_LCD_H_

#include "main.h"


#define LCD_D0_Pin              GPIO_PIN_0
#define LCD_D1_Pin              GPIO_PIN_1
#define LCD_D2_Pin              GPIO_PIN_2
#define LCD_D3_Pin              GPIO_PIN_3
#define LCD_D4_Pin              GPIO_PIN_4
#define LCD_D5_Pin              GPIO_PIN_5
#define LCD_D6_Pin              GPIO_PIN_6
#define LCD_D7_Pin              GPIO_PIN_7
#define LCD_DATA_GPIO_Port      GPIOC

#define IO_IN                   0X55
#define IO_OUT                  0XAA

#define LCD_WRITE_DATA(data)    (LCD_DATA_GPIO_Port->BSRR=(((uint32_t)(uint8_t)~(data))<<16)|((uint32_t)(uint8_t)(data)))
#define LCD_READ_DATA()         ((uint8_t)(LCD_DATA_GPIO_Port->IDR & 0XFF))

#define LCD_DATA_IO_IN()        bsplcd_data_io_dir_set(IO_IN)
#define LCD_DATA_IO_OUT()       bsplcd_data_io_dir_set(IO_OUT)

#define LCD_BLK_ENABLE()        HAL_GPIO_WritePin(LCD_CTL_GPIO_Port, LCD_BL_Pin, GPIO_PIN_SET)
#define LCD_BLK_DISABLE()       HAL_GPIO_WritePin(LCD_CTL_GPIO_Port, LCD_BL_Pin, GPIO_PIN_RESET)


#define LCD_RST_SET(val)        \
            do { \
                if(val) \
                    HAL_GPIO_WritePin(LCD_CTL_GPIO_Port, LCD_RST_Pin, GPIO_PIN_SET); \
                else \
                    HAL_GPIO_WritePin(LCD_CTL_GPIO_Port, LCD_RST_Pin, GPIO_PIN_RESET); \
            }while(0)

#define LCD_CS_SET(val)        \
            do { \
                if(val) \
                    HAL_GPIO_WritePin(LCD_CTL_GPIO_Port, LCD_CS_Pin, GPIO_PIN_SET); \
                else \
                    HAL_GPIO_WritePin(LCD_CTL_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET); \
            }while(0)

/* 指令/数据选择信号 */
#define LCD_A0_SET(val)        \
            do { \
                if(val) \
                    HAL_GPIO_WritePin(LCD_CTL_GPIO_Port, LCD_A0_Pin, GPIO_PIN_SET); \
                else \
                    HAL_GPIO_WritePin(LCD_CTL_GPIO_Port, LCD_A0_Pin, GPIO_PIN_RESET); \
            }while(0)

#define LCD_WR_SET(val)        \
            do { \
                if(val) \
                    HAL_GPIO_WritePin(LCD_CTL_GPIO_Port, LCD_WR_Pin, GPIO_PIN_SET); \
                else \
                    HAL_GPIO_WritePin(LCD_CTL_GPIO_Port, LCD_WR_Pin, GPIO_PIN_RESET); \
            }while(0)

#define LCD_RD_SET(val)        \
            do { \
                if(val) \
                    HAL_GPIO_WritePin(LCD_CTL_GPIO_Port, LCD_RD_Pin, GPIO_PIN_SET); \
                else \
                    HAL_GPIO_WritePin(LCD_CTL_GPIO_Port, LCD_RD_Pin, GPIO_PIN_RESET); \
            }while(0)

typedef enum{
    WORD_TYPE,
    AREA_TYPE,
}white_type;

/* Funstions declared *********************************************************************/
void bsplcd_data_io_dir_set(u8 dir);


void bsplcd_init(void);

void bsplcd_address(u8 x, u8 y, u8 x_total, u8 y_total);
void bsplcd_display_onoff(u8 sta);
void bsplcd_clear_fullscreen(void);

void bsp_lcd_test(void);


#endif /* __BSP_LCD_H_ */

